﻿#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//定义链式二叉树的结构--节点结构
typedef char BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType data;//存储数据
	struct BinaryTreeNode* left;//指针指向左孩子节点（左子树）
	struct BinaryTreeNode* right;//指针指向右孩子节点（右子树）
}BTNode;


//申请节点空间
BTNode* buyNode(char x);

//创建二叉树
BTNode* createTree();

//前序遍历---根左右
void PreOrder(BTNode* root);

//中序遍历---左根右
void InOrder(BTNode* root);

//后序遍历--左右根
void PostOrder(BTNode* root);

//树的有效节点个数

//传参
//int BinaryTreeSize(BTNode* root, int* psize);



//树节点总数 = 1 + 左子树节点个数 + 右子树的节点个数
int BinaryTreeSize(BTNode* root);

//二叉树的叶子节点个数
//总的叶子节点个数 = 左子树叶子节点树 + 右子树叶子节点数
int BinaryTreeLeafSize(BTNode* root);

//求第k层节点个数
//第k层节点个数 = 左子树第k层节点个数 + 右子树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k);

//求树的深度/高度
int BinaryTreeDepth(BTNode* root);

// ⼆叉树查找值为x的结点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);

// ⼆叉树销毁
void BinaryTreeDestory(BTNode** root);
